
class_name Unit
extends Node2D




## 头像
@export_file("*.png", "*.jpg") var profile_photo = ""
## 控制器
@export var controller: Controller = null
## 组件
@onready var property = $Property
@onready var action = $Action
@onready var skill = $Skill
## UI组件
@onready var show_icon = $ShowAction
@onready var icon = $Icon
@onready var ui: UnitUI = $UI




# 行动开始信号与结束信号
signal action_start_signal
signal action_end_siganl
# 移动请求信号
signal move_request_signal
# 攻击请求信号
signal attack_request_signal
# 技能请求信号
signal skill_request_signal
# 显示范围
signal show_scope_signal
# 死亡信号
signal die_signal




func _ready() -> void:
	ui.set_process_input(false)
	# 在加载时，如果控制器对象不为空就会让控制器加载该对象
	# 这个运用于在编辑关卡时设置敌人时会用到
	if controller != null:
		controller.add_unit(self)
	
	ui.attack_signal.connect(action.attack_request) # 攻击
	ui.skill_signal.connect(skill.skill_request) # 技能
	ui.move_signal.connect(action.move_request) # 移动
	ui.end_signal.connect(end_action) # 结束




## 返回所属阵营
func get_unit_camp() -> String:
	if controller != null:
		return controller.camp
	return ""




## 行动开始时调用
func start_action() -> void:
	set_state(UnitProperty.ACTION_STATE.ACTION)
	show_icon.show()
	controller.unit_start_action(self)




## 行动结束时调用
func end_action() -> void:
	hide_action_ui()
	set_state(UnitProperty.ACTION_STATE.END)
	show_icon.hide()
	controller.unit_end_action(self)




## 根据路径设置 icon
func set_icon_load(_load: String) -> void:
	icon.texture = load(_load)




## 根据纹理设置 icon
func set_icon_texture(_texture: Texture2D) -> void:
	icon.texture = _texture




## 指针点击反应
func pointer_callable() -> void:
	# 指针调用，判断一下持有者是否是玩家
	# 如果是玩家的且正在行动就调用 ui
	if controller == GData.player and \
		property.action_state == UnitProperty.ACTION_STATE.ACTION:
		show_action_ui()
	# 显示 unit 的移动与攻击范围
	else:
		emit_signal("show_scope_signal", self)




## 指针进入
func pointer_entered() -> void:
	pass




## 指针离开
func pointer_exited() -> void:
	pass




## 设置行动状态
func set_state(_state: UnitProperty.ACTION_STATE) -> void:
	property.action_state = _state




## 显示操作ui
func show_action_ui() -> void:
	ui.start()




## 隐藏操作ui
func hide_action_ui() -> void:
	ui.end()




## 单位死亡调用
func die(_property: UnitProperty) -> void:
	emit_signal("die_signal", self)




## 重置状态
## 目前会回复至固定值
## 或许可能会根据变量来回复
func settlement() -> void:
	property.attack_chance = 1
	property.move_chance = 2
	property.action_chance = 2
	set_state(UnitProperty.ACTION_STATE.NONE)




## 回合结束时由 unit-manage 调用
func cycle(_round_number: int) -> void:
	property.cycle(_round_number)
	skill.cycle(_round_number)
